home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / term-source.lha / TrapPanel.c < prev    next >
C/C++ Source or Header  |  1995-09-28  |  21KB  |  898 lines

  1. /*
  2. **    TrapPanel.c
  3. **
  4. **    Editing panel for trap list
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_LIST,GAD_SEQUENCE,GAD_COMMAND,
  13.         GAD_TOP,GAD_UP,GAD_DOWN,GAD_END,
  14.         GAD_NEW,GAD_REMOVE,GAD_CLEAR,
  15.         GAD_LOAD,GAD_SAVE,GAD_USE,GAD_CLOSE
  16.     };
  17.  
  18. VOID
  19. TrapPanel()
  20. {
  21.     struct LayoutHandle    *Handle;
  22.     struct GenericList    *TrapList;
  23.     struct TrapNode        *Node,
  24.                 *Next;
  25.  
  26.     ObtainSemaphore(&GenericListTable[GLIST_TRAP] -> ListSemaphore);
  27.  
  28.     TrapList = GenericListTable[GLIST_TRAP];
  29.  
  30.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  31.         LH_LocaleHook,    &LocaleHook,
  32.     TAG_DONE))
  33.     {
  34.         struct Window    *LocalWindow;
  35.         struct IBox     Bounds;
  36.  
  37.         LT_New(Handle,
  38.             LA_Type,    VERTICAL_KIND,
  39.         TAG_DONE);
  40.         {
  41.             LT_New(Handle,
  42.                 LA_Type,    VERTICAL_KIND,
  43.                 LA_LabelID,    MSG_TRAPPANEL_TRAP_CONTROLS_TXT,
  44.             TAG_DONE);
  45.             {
  46.                 LONG MaxWidth,MaxHeight;
  47.  
  48.                 MaxWidth = MaxHeight = 0;
  49.  
  50.                 if(TrapList)
  51.                 {
  52.                     struct Node *Node;
  53.                     LONG Len;
  54.  
  55.                     for(Node = (struct Node *)TrapList -> ListHeader . mlh_Head ; Node -> ln_Succ ; Node = Node -> ln_Succ)
  56.                     {
  57.                         Len = strlen(Node -> ln_Name);
  58.  
  59.                         if(Len > MaxWidth)
  60.                             MaxWidth = Len;
  61.  
  62.                         MaxHeight++;
  63.                     }
  64.                 }
  65.  
  66.                 if(MaxWidth < 30)
  67.                     MaxWidth = 30;
  68.  
  69.                 if(MaxHeight < 10)
  70.                     MaxHeight = 10;
  71.                 else
  72.                 {
  73.                     if(MaxHeight > 20)
  74.                         MaxHeight = 20;
  75.                 }
  76.  
  77.                 LT_New(Handle,
  78.                     LA_Type,    LISTVIEW_KIND,
  79.                     LA_LabelID,    MSG_TRAPPANEL_TRAP_LIST_TXT,
  80.                     LA_LabelPlace,    PLACE_LEFT,
  81.                     LA_Chars,    30,
  82.                     LA_Lines,    10,
  83.                     LA_ID,        GAD_LIST,
  84.                     LALV_CursorKey,    TRUE,
  85.                     LALV_MaxGrowX,    MaxWidth,
  86.                     LALV_MaxGrowY,    MaxHeight,
  87.                     LALV_ResizeY,    TRUE,
  88.                     LALV_ResizeX,    TRUE,
  89.                     GTLV_Labels,    TrapList,
  90.  
  91.                     Kick30 ? LALV_Link : TAG_IGNORE, NIL_LINK,
  92.                 TAG_DONE);
  93.  
  94.                 LT_New(Handle,
  95.                     LA_Type,    STRING_KIND,
  96.                     LA_LabelID,    MSG_TRAPPANEL_SEQUENCE_TXT,
  97.                     LA_ID,        GAD_SEQUENCE,
  98.                     GTST_MaxChars,    255,
  99.                     GA_Disabled,    TRUE,
  100.                 TAG_DONE);
  101.  
  102.                 LT_New(Handle,
  103.                     LA_Type,    STRING_KIND,
  104.                     LA_LabelID,    MSG_TRAPPANEL_COMMAND_TXT,
  105.                     LA_ID,        GAD_COMMAND,
  106.                     GTST_MaxChars,    255,
  107.                     GA_Disabled,    TRUE,
  108.                 TAG_DONE);
  109.  
  110.                 LT_EndGroup(Handle);
  111.             }
  112.  
  113.             LT_New(Handle,
  114.                 LA_Type,    HORIZONTAL_KIND,
  115.             TAG_DONE);
  116.             {
  117.                 LT_New(Handle,
  118.                     LA_Type,    HORIZONTAL_KIND,
  119.                     LA_LabelID,    MSG_V36_0038,
  120.                     LA_Spread,    TRUE,
  121.                     LA_SameSize,    TRUE,
  122.                 TAG_DONE);
  123.                 {
  124.                     LT_New(Handle,
  125.                         LA_Type,    TAPEDECK_KIND,
  126.                         LATD_ButtonType,TDBT_PREVIOUS,
  127.                         LATD_Smaller,    TRUE,
  128.                         LA_ID,        GAD_TOP,
  129.                         LA_NoKey,    TRUE,
  130.                         GA_Disabled,    TRUE,
  131.                     TAG_DONE);
  132.  
  133.                     LT_New(Handle,
  134.                         LA_Type,    TAPEDECK_KIND,
  135.                         LATD_ButtonType,TDBT_REWIND,
  136.                         LATD_Smaller,    TRUE,
  137.                         LA_ID,        GAD_UP,
  138.                         LA_NoKey,    TRUE,
  139.                         GA_Disabled,    TRUE,
  140.                     TAG_DONE);
  141.  
  142.                     LT_New(Handle,
  143.                         LA_Type,    TAPEDECK_KIND,
  144.                         LATD_ButtonType,TDBT_PLAY,
  145.                         LATD_Smaller,    TRUE,
  146.                         LA_ID,        GAD_DOWN,
  147.                         LA_NoKey,    TRUE,
  148.                         GA_Disabled,    TRUE,
  149.                     TAG_DONE);
  150.  
  151.                     LT_New(Handle,
  152.                         LA_Type,    TAPEDECK_KIND,
  153.                         LATD_ButtonType,TDBT_NEXT,
  154.                         LATD_Smaller,    TRUE,
  155.                         LA_ID,        GAD_END,
  156.                         LA_NoKey,    TRUE,
  157.                         GA_Disabled,    TRUE,
  158.                     TAG_DONE);
  159.  
  160.                     LT_EndGroup(Handle);
  161.                 }
  162.  
  163.                 LT_New(Handle,
  164.                     LA_Type,    HORIZONTAL_KIND,
  165.                     LA_LabelID,    MSG_V36_0043,
  166.                     LA_Spread,    TRUE,
  167.                     LA_SameSize,    TRUE,
  168.                 TAG_DONE);
  169.                 {
  170.                     LT_New(Handle,
  171.                         LA_Type,    BUTTON_KIND,
  172.                         LA_LabelID,    MSG_FASTMACROPANEL_NEW_GAD,
  173.                         LA_ID,        GAD_NEW,
  174.                     TAG_DONE);
  175.  
  176.                     LT_New(Handle,
  177.                         LA_Type,    BUTTON_KIND,
  178.                         LA_LabelID,    MSG_GLOBAL_REMOVE_GAD,
  179.                         LA_ID,        GAD_REMOVE,
  180.                         GA_Disabled,    TRUE,
  181.                     TAG_DONE);
  182.  
  183.                     LT_New(Handle,
  184.                         LA_Type,    BUTTON_KIND,
  185.                         LA_LabelID,    MSG_UPLOADQUEUE_CLEAR_TXT,
  186.                         LA_ID,        GAD_CLEAR,
  187.                         GA_Disabled,    TrapList -> ListHeader . mlh_Head -> mln_Succ == NULL,
  188.                     TAG_DONE);
  189.  
  190.                     LT_EndGroup(Handle);
  191.                 }
  192.  
  193.                 LT_EndGroup(Handle);
  194.             }
  195.  
  196.             LT_New(Handle,
  197.                 LA_Type,    VERTICAL_KIND,
  198.             TAG_DONE);
  199.             {
  200.                 LT_New(Handle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  201.  
  202.                 LT_EndGroup(Handle);
  203.             }
  204.  
  205.             LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  206.                 LAGR_SameSize,    TRUE,
  207.                 LAGR_Spread,    TRUE,
  208.                 LA_ExtraSpace,    TRUE,
  209.             TAG_DONE);
  210.             {
  211.                 LT_New(Handle,
  212.                     LA_Type,    BUTTON_KIND,
  213.                     LA_LabelID,    MSG_GLOBAL_USE_GAD,
  214.                     LA_ID,        GAD_USE,
  215.                     LABT_ReturnKey,    TRUE,
  216.                     LABT_ExtraFat,    TRUE,
  217.                 TAG_DONE);
  218.  
  219.                 LT_New(Handle,
  220.                     LA_Type,    BUTTON_KIND,
  221.                     LA_LabelID,    MSG_GLOBAL_LOAD_GAD,
  222.                     LA_ID,        GAD_LOAD,
  223.                     LABT_ExtraFat,    TRUE,
  224.                 TAG_DONE);
  225.  
  226.                 LT_New(Handle,
  227.                     LA_Type,    BUTTON_KIND,
  228.                     LA_LabelID,    MSG_GLOBAL_SAVE_GAD,
  229.                     LA_ID,        GAD_SAVE,
  230.                     LABT_ExtraFat,    TRUE,
  231.                     GA_Disabled,    TrapList -> ListHeader . mlh_Head -> mln_Succ == NULL,
  232.                 TAG_DONE);
  233.  
  234.                 LT_New(Handle,
  235.                     LA_Type,    BUTTON_KIND,
  236.                     LA_LabelID,    MSG_GLOBAL_CLOSE_TXT,
  237.                     LA_ID,        GAD_CLOSE,
  238.                     LABT_EscKey,    TRUE,
  239.                     LABT_ExtraFat,    TRUE,
  240.                 TAG_DONE);
  241.  
  242.                 LT_EndGroup(Handle);
  243.             }
  244.  
  245.             LT_EndGroup(Handle);
  246.         }
  247.  
  248.         if(Screen && Window)
  249.         {
  250.             Bounds . Left    = Window -> LeftEdge;
  251.             Bounds . Top    = Window -> TopEdge;
  252.             Bounds . Width    = Window -> Width;
  253.             Bounds . Height    = Window -> Height;
  254.         }
  255.  
  256.         if(LocalWindow = LT_Build(Handle,
  257.             LAWN_TitleID,        MSG_TRAPPANEL_TRAP_PREFERENCES_TXT,
  258.             LAWN_IDCMP,        IDCMP_CLOSEWINDOW,
  259.             LAWN_HelpHook,        &GuideHook,
  260.             LAWN_Parent,        Window,
  261.             WA_DepthGadget,        TRUE,
  262.             WA_CloseGadget,        TRUE,
  263.             WA_DragBar,        TRUE,
  264.             WA_RMBTrap,        TRUE,
  265.             WA_Activate,        TRUE,
  266.             WA_SimpleRefresh,    TRUE,
  267.  
  268.             Screen ? LAWN_Bounds : TAG_IGNORE, &Bounds,
  269.         TAG_DONE))
  270.         {
  271.             struct IntuiMessage    *Message;
  272.             BOOLEAN             Done = FALSE;
  273.             ULONG             MsgClass;
  274.             UWORD             MsgCode;
  275.             struct Gadget        *MsgGadget;
  276.  
  277.             struct TrapNode        *Selected = NULL;
  278.             ULONG             Offset = 0;
  279.  
  280.             UBYTE              DummyBuffer[MAX_FILENAME_LENGTH],
  281.                         *DummyChar;
  282.             struct FileRequester    *FileRequest;
  283.  
  284.             GuideContext(CONTEXT_TRAPS);
  285.  
  286.             PushWindow(LocalWindow);
  287.  
  288.             do
  289.             {
  290.                 if(Wait(PORTMASK(LocalWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  291.                     break;
  292.  
  293.                 while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
  294.                 {
  295.                     MsgClass    = Message -> Class;
  296.                     MsgCode        = Message -> Code;
  297.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  298.  
  299.                     LT_ReplyIMsg(Message);
  300.  
  301.                     if(MsgClass == IDCMP_CLOSEWINDOW)
  302.                         Done = TRUE;
  303.  
  304.                     if(MsgClass == IDCMP_GADGETUP)
  305.                     {
  306.                         switch(MsgGadget -> GadgetID)
  307.                         {
  308.                             case GAD_CLOSE:
  309.                             case GAD_USE:
  310.  
  311.                                 Done = TRUE;
  312.                                 break;
  313.  
  314.                             case GAD_TOP:
  315.  
  316.                                 LT_SetAttributes(Handle,GAD_LIST,
  317.                                     GTLV_Labels,    ~0,
  318.                                 TAG_DONE);
  319.  
  320.                                 Remove((struct Node *)Selected);
  321.  
  322.                                 AddHead((struct List *)TrapList,(struct Node *)Selected);
  323.  
  324.                                 Offset = 0;
  325.  
  326.                                 LT_SetAttributes(Handle,GAD_LIST,
  327.                                     GTLV_Labels,    TrapList,
  328.                                     GTLV_Selected,    Offset,
  329.                                     GTLV_Top,    Offset,
  330.                                 TAG_DONE);
  331.  
  332.                                 LT_SetAttributes(Handle,GAD_TOP,
  333.                                     GA_Disabled,    TRUE,
  334.                                 TAG_DONE);
  335.  
  336.                                 LT_SetAttributes(Handle,GAD_UP,
  337.                                     GA_Disabled,    TRUE,
  338.                                 TAG_DONE);
  339.  
  340.                                 LT_SetAttributes(Handle,GAD_DOWN,
  341.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  342.                                 TAG_DONE);
  343.  
  344.                                 LT_SetAttributes(Handle,GAD_END,
  345.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  346.                                 TAG_DONE);
  347.  
  348.                                 TrapsChanged = TRUE;
  349.                                 break;
  350.  
  351.                             case GAD_UP:
  352.  
  353.                                 LT_SetAttributes(Handle,GAD_LIST,
  354.                                     GTLV_Labels,    ~0,
  355.                                 TAG_DONE);
  356.  
  357.                                 Node = (struct TrapNode *)Selected -> Node . ln_Pred -> ln_Pred;
  358.  
  359.                                 Remove((struct Node *)Selected);
  360.  
  361.                                 Insert((struct List *)TrapList,(struct Node *)Selected,(struct Node *)Node);
  362.  
  363.                                 Offset--;
  364.  
  365.                                 LT_SetAttributes(Handle,GAD_LIST,
  366.                                     GTLV_Labels,    TrapList,
  367.                                     GTLV_Selected,    Offset,
  368.                                     GTLV_Top,    Offset,
  369.                                 TAG_DONE);
  370.  
  371.                                 LT_SetAttributes(Handle,GAD_TOP,
  372.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  373.                                 TAG_DONE);
  374.  
  375.                                 LT_SetAttributes(Handle,GAD_UP,
  376.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  377.                                 TAG_DONE);
  378.  
  379.                                 LT_SetAttributes(Handle,GAD_DOWN,
  380.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  381.                                 TAG_DONE);
  382.  
  383.                                 LT_SetAttributes(Handle,GAD_END,
  384.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  385.                                 TAG_DONE);
  386.  
  387.                                 TrapsChanged = TRUE;
  388.  
  389.                                 break;
  390.  
  391.                             case GAD_DOWN:
  392.  
  393.                                 LT_SetAttributes(Handle,GAD_LIST,
  394.                                     GTLV_Labels,    ~0,
  395.                                 TAG_DONE);
  396.  
  397.                                 Node = (struct TrapNode *)Selected -> Node . ln_Succ;
  398.  
  399.                                 Remove((struct Node *)Selected);
  400.  
  401.                                 Insert((struct List *)TrapList,(struct Node *)Selected,(struct Node *)Node);
  402.  
  403.                                 Offset++;
  404.  
  405.                                 LT_SetAttributes(Handle,GAD_LIST,
  406.                                     GTLV_Labels,    TrapList,
  407.                                     GTLV_Selected,    Offset,
  408.                                     GTLV_Top,    Offset,
  409.                                 TAG_DONE);
  410.  
  411.                                 LT_SetAttributes(Handle,GAD_TOP,
  412.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  413.                                 TAG_DONE);
  414.  
  415.                                 LT_SetAttributes(Handle,GAD_UP,
  416.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  417.                                 TAG_DONE);
  418.  
  419.                                 LT_SetAttributes(Handle,GAD_DOWN,
  420.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  421.                                 TAG_DONE);
  422.  
  423.                                 LT_SetAttributes(Handle,GAD_END,
  424.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  425.                                 TAG_DONE);
  426.  
  427.                                 TrapsChanged = TRUE;
  428.  
  429.                                 break;
  430.  
  431.                             case GAD_END:
  432.  
  433.                                 LT_SetAttributes(Handle,GAD_LIST,
  434.                                     GTLV_Labels,    ~0,
  435.                                 TAG_DONE);
  436.  
  437.                                 Remove((struct Node *)Selected);
  438.  
  439.                                 AddTail((struct List *)TrapList,(struct Node *)Selected);
  440.  
  441.                                 Offset = TrapList -> ListCount - 1;
  442.  
  443.                                 LT_SetAttributes(Handle,GAD_LIST,
  444.                                     GTLV_Labels,    TrapList,
  445.                                     GTLV_Selected,    Offset,
  446.                                     GTLV_Top,    Offset,
  447.                                 TAG_DONE);
  448.  
  449.                                 LT_SetAttributes(Handle,GAD_TOP,
  450.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  451.                                 TAG_DONE);
  452.  
  453.                                 LT_SetAttributes(Handle,GAD_UP,
  454.                                     GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  455.                                 TAG_DONE);
  456.  
  457.                                 LT_SetAttributes(Handle,GAD_DOWN,
  458.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  459.                                 TAG_DONE);
  460.  
  461.                                 LT_SetAttributes(Handle,GAD_END,
  462.                                     GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  463.                                 TAG_DONE);
  464.  
  465.                                 TrapsChanged = TRUE;
  466.  
  467.                                 break;
  468.  
  469.                             case GAD_NEW:
  470.  
  471.                                 if(Node = CreateTrapNode("",""))
  472.                                 {
  473.                                     LT_SetAttributes(Handle,GAD_LIST,
  474.                                         GTLV_Labels,    ~0,
  475.                                     TAG_DONE);
  476.  
  477.                                     AddTail((struct List *)TrapList,(struct Node *)Node);
  478.  
  479.                                     LT_SetAttributes(Handle,GAD_LIST,
  480.                                         GTLV_Labels,    TrapList,
  481.                                         GTLV_Selected,    TrapList -> ListCount++,
  482.                                     TAG_DONE);
  483.  
  484.                                     LT_SetAttributes(Handle,GAD_COMMAND,
  485.                                         GTST_String,    "",
  486.                                         GA_Disabled,    FALSE,
  487.                                     TAG_DONE);
  488.  
  489.                                     LT_SetAttributes(Handle,GAD_SEQUENCE,
  490.                                         GTST_String,    "",
  491.                                         GA_Disabled,    FALSE,
  492.                                     TAG_DONE);
  493.  
  494.                                     LT_SetAttributes(Handle,GAD_REMOVE,
  495.                                         GA_Disabled,    FALSE,
  496.                                     TAG_DONE);
  497.  
  498.                                     LT_SetAttributes(Handle,GAD_SAVE,
  499.                                         GA_Disabled,    FALSE,
  500.                                     TAG_DONE);
  501.  
  502.                                     LT_SetAttributes(Handle,GAD_CLEAR,
  503.                                         GA_Disabled,    FALSE,
  504.                                     TAG_DONE);
  505.  
  506.                                     Selected = Node;
  507.  
  508.                                     Offset = MsgCode;
  509.  
  510.                                     LT_SetAttributes(Handle,GAD_TOP,
  511.                                         GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  512.                                     TAG_DONE);
  513.  
  514.                                     LT_SetAttributes(Handle,GAD_UP,
  515.                                         GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  516.                                     TAG_DONE);
  517.  
  518.                                     LT_SetAttributes(Handle,GAD_DOWN,
  519.                                         GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  520.                                     TAG_DONE);
  521.  
  522.                                     LT_SetAttributes(Handle,GAD_END,
  523.                                         GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  524.                                     TAG_DONE);
  525.  
  526.                                     LT_Activate(Handle,GAD_SEQUENCE);
  527.  
  528.                                     TrapsChanged = TRUE;
  529.                                 }
  530.                                 else
  531.                                     DisplayBeep(LocalWindow -> WScreen);
  532.  
  533.                                 break;
  534.  
  535.                             case GAD_CLEAR:
  536.  
  537.                                 LT_SetAttributes(Handle,GAD_LIST,
  538.                                     GTLV_Labels,    ~0,
  539.                                 TAG_DONE);
  540.  
  541.                                 FreeList((struct List *)TrapList);
  542.  
  543.                                 TrapList -> ListCount = 0;
  544.  
  545.                                 LT_SetAttributes(Handle,GAD_LIST,
  546.                                     GTLV_Labels,    TrapList,
  547.                                     GTLV_Selected,    ~0,
  548.                                 TAG_DONE);
  549.  
  550.                                 Selected = NULL;
  551.  
  552.                                 LT_SetAttributes(Handle,GAD_TOP,
  553.                                     GA_Disabled,    TRUE,
  554.                                 TAG_DONE);
  555.  
  556.                                 LT_SetAttributes(Handle,GAD_UP,
  557.                                     GA_Disabled,    TRUE,
  558.                                 TAG_DONE);
  559.  
  560.                                 LT_SetAttributes(Handle,GAD_DOWN,
  561.                                     GA_Disabled,    TRUE,
  562.                                 TAG_DONE);
  563.  
  564.                                 LT_SetAttributes(Handle,GAD_END,
  565.                                     GA_Disabled,    TRUE,
  566.                                 TAG_DONE);
  567.  
  568.                                 LT_SetAttributes(Handle,GAD_REMOVE,
  569.                                     GA_Disabled,    TRUE,
  570.                                 TAG_DONE);
  571.  
  572.                                 LT_SetAttributes(Handle,GAD_SEQUENCE,
  573.                                     GTST_String,    "",
  574.                                     GA_Disabled,    TRUE,
  575.                                 TAG_DONE);
  576.  
  577.                                 LT_SetAttributes(Handle,GAD_COMMAND,
  578.                                     GTST_String,    "",
  579.                                     GA_Disabled,    TRUE,
  580.                                 TAG_DONE);
  581.  
  582.                                 LT_SetAttributes(Handle,GAD_SAVE,
  583.                                     GA_Disabled,    TRUE,
  584.                                 TAG_DONE);
  585.  
  586.                                 LT_SetAttributes(Handle,GAD_CLEAR,
  587.                                     GA_Disabled,    TRUE,
  588.                                 TAG_DONE);
  589.  
  590.                                 TrapsChanged = FALSE;
  591.  
  592.                                 break;
  593.  
  594.                             case GAD_REMOVE:
  595.  
  596.                                 if(Selected)
  597.                                 {
  598.                                     LT_SetAttributes(Handle,GAD_LIST,
  599.                                         GTLV_Labels,    ~0,
  600.                                     TAG_DONE);
  601.  
  602.                                     if(--TrapList -> ListCount)
  603.                                     {
  604.                                         if(Selected -> Node . ln_Succ -> ln_Succ)
  605.                                             Node = (struct TrapNode *)Selected -> Node . ln_Succ;
  606.                                         else
  607.                                         {
  608.                                             Node = (struct TrapNode *)Selected -> Node . ln_Pred;
  609.  
  610.                                             Offset = 0;
  611.                                         }
  612.                                     }
  613.  
  614.                                     FreeNode((struct Node *)Selected);
  615.  
  616.                                     LT_SetAttributes(Handle,GAD_LIST,
  617.                                         GTLV_Labels,    TrapList,
  618.                                         GTLV_Selected,    Node -> Node . ln_Succ ? GetNodeOffset((struct Node *)Node,(struct List *)TrapList) : ~0,
  619.                                     TAG_DONE);
  620.  
  621.                                     if(!TrapList -> ListCount)
  622.                                     {
  623.                                         Selected = NULL;
  624.  
  625.                                         LT_SetAttributes(Handle,GAD_TOP,
  626.                                             GA_Disabled,    TRUE,
  627.                                         TAG_DONE);
  628.  
  629.                                         LT_SetAttributes(Handle,GAD_UP,
  630.                                             GA_Disabled,    TRUE,
  631.                                         TAG_DONE);
  632.  
  633.                                         LT_SetAttributes(Handle,GAD_DOWN,
  634.                                             GA_Disabled,    TRUE,
  635.                                         TAG_DONE);
  636.  
  637.                                         LT_SetAttributes(Handle,GAD_END,
  638.                                             GA_Disabled,    TRUE,
  639.                                         TAG_DONE);
  640.  
  641.                                         LT_SetAttributes(Handle,GAD_REMOVE,
  642.                                             GA_Disabled,    TRUE,
  643.                                         TAG_DONE);
  644.  
  645.                                         LT_SetAttributes(Handle,GAD_SEQUENCE,
  646.                                             GTST_String,    "",
  647.                                             GA_Disabled,    TRUE,
  648.                                         TAG_DONE);
  649.  
  650.                                         LT_SetAttributes(Handle,GAD_COMMAND,
  651.                                             GTST_String,    "",
  652.                                             GA_Disabled,    TRUE,
  653.                                         TAG_DONE);
  654.  
  655.                                         LT_SetAttributes(Handle,GAD_SAVE,
  656.                                             GA_Disabled,    TRUE,
  657.                                         TAG_DONE);
  658.  
  659.                                         LT_SetAttributes(Handle,GAD_CLEAR,
  660.                                             GA_Disabled,    TRUE,
  661.                                         TAG_DONE);
  662.                                     }
  663.                                     else
  664.                                     {
  665.                                         Selected = Node;
  666.  
  667.                                         LT_SetAttributes(Handle,GAD_COMMAND,
  668.                                             GTST_String,    Selected -> Command,
  669.                                         TAG_DONE);
  670.  
  671.                                         LT_SetAttributes(Handle,GAD_SEQUENCE,
  672.                                             GTST_String,    Selected -> Node . ln_Name,
  673.                                         TAG_DONE);
  674.  
  675.                                         LT_SetAttributes(Handle,GAD_TOP,
  676.                                             GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  677.                                         TAG_DONE);
  678.  
  679.                                         LT_SetAttributes(Handle,GAD_UP,
  680.                                             GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  681.                                         TAG_DONE);
  682.  
  683.                                         LT_SetAttributes(Handle,GAD_DOWN,
  684.                                             GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  685.                                         TAG_DONE);
  686.  
  687.                                         LT_SetAttributes(Handle,GAD_END,
  688.                                             GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  689.                                         TAG_DONE);
  690.                                     }
  691.  
  692.                                     TrapsChanged = TRUE;
  693.                                 }
  694.  
  695.                                 break;
  696.  
  697.                             case GAD_LIST:
  698.  
  699.                                 if(Selected = (struct TrapNode *)GetListNode(MsgCode,(struct List *)TrapList))
  700.                                 {
  701.                                     Offset = MsgCode;
  702.  
  703.                                     LT_SetAttributes(Handle,GAD_SEQUENCE,
  704.                                         GTST_String,    Selected -> Node . ln_Name,
  705.                                         GA_Disabled,    FALSE,
  706.                                     TAG_DONE);
  707.  
  708.                                     LT_SetAttributes(Handle,GAD_COMMAND,
  709.                                         GTST_String,    Selected -> Command,
  710.                                         GA_Disabled,    FALSE,
  711.                                     TAG_DONE);
  712.  
  713.                                     LT_SetAttributes(Handle,GAD_REMOVE,
  714.                                         GA_Disabled,    FALSE,
  715.                                     TAG_DONE);
  716.  
  717.                                     LT_SetAttributes(Handle,GAD_TOP,
  718.                                         GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  719.                                     TAG_DONE);
  720.  
  721.                                     LT_SetAttributes(Handle,GAD_UP,
  722.                                         GA_Disabled,    !Selected -> Node . ln_Pred -> ln_Pred,
  723.                                     TAG_DONE);
  724.  
  725.                                     LT_SetAttributes(Handle,GAD_DOWN,
  726.                                         GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  727.                                     TAG_DONE);
  728.  
  729.                                     LT_SetAttributes(Handle,GAD_END,
  730.                                         GA_Disabled,    !Selected -> Node . ln_Succ -> ln_Succ,
  731.                                     TAG_DONE);
  732.                                 }
  733.  
  734.                                 break;
  735.  
  736.                             case GAD_SEQUENCE:
  737.  
  738.                                 if(Selected)
  739.                                 {
  740.                                     LT_SetAttributes(Handle,GAD_LIST,
  741.                                         GTLV_Labels,    ~0,
  742.                                     TAG_DONE);
  743.  
  744.                                     Selected = ChangeTrapNode(TrapList,Selected,(STRPTR)LT_GetAttributes(Handle,GAD_SEQUENCE,TAG_DONE),NULL);
  745.  
  746.                                     LT_SetAttributes(Handle,GAD_LIST,
  747.                                         GTLV_Labels,    TrapList,
  748.                                         GTLV_Selected,    GetNodeOffset((struct Node *)Selected,(struct List *)TrapList),
  749.                                     TAG_DONE);
  750.  
  751.                                     LT_SetAttributes(Handle,GAD_COMMAND,
  752.                                         GTST_String,    Selected -> Command,
  753.                                     TAG_DONE);
  754.  
  755.                                     LT_SetAttributes(Handle,GAD_SEQUENCE,
  756.                                         GTST_String,    Selected -> Node . ln_Name,
  757.                                     TAG_DONE);
  758.  
  759.                                     TrapsChanged = TRUE;
  760.  
  761.                                     LT_Activate(Handle,GAD_COMMAND);
  762.                                 }
  763.  
  764.                                 break;
  765.  
  766.                             case GAD_COMMAND:
  767.  
  768.                                 if(Selected)
  769.                                 {
  770.                                     Selected = ChangeTrapNode(TrapList,Selected,NULL,(STRPTR)LT_GetAttributes(Handle,GAD_COMMAND,TAG_DONE));
  771.  
  772.                                     TrapsChanged = TRUE;
  773.                                 }
  774.  
  775.                                 break;
  776.  
  777.                             case GAD_LOAD:
  778.  
  779.                                 SplitFileName(LastTraps,&DummyChar,DummyBuffer);
  780.  
  781.                                 LT_LockWindow(LocalWindow);
  782.  
  783.                                 if(FileRequest = GetFile(LocalWindow,LocaleString(MSG_TRAPPANEL_LOAD_TRAP_SETTINGS_TXT),DummyBuffer,FilePart(LastTraps),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  784.                                 {
  785.                                     LT_SetAttributes(Handle,GAD_LIST,
  786.                                         GTLV_Labels,    ~0,
  787.                                     TAG_DONE);
  788.  
  789.                                     Selected = NULL;
  790.  
  791.                                     if(!LoadTraps(DummyBuffer,TrapList))
  792.                                         ShowError(LocalWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
  793.                                     else
  794.                                     {
  795.                                         strcpy(LastTraps,DummyBuffer);
  796.  
  797.                                         TrapsChanged = FALSE;
  798.                                     }
  799.  
  800.                                     LT_SetAttributes(Handle,GAD_LIST,
  801.                                         GTLV_Labels,    TrapList,
  802.                                     TAG_DONE);
  803.  
  804.                                     LT_SetAttributes(Handle,GAD_COMMAND,
  805.                                         GTST_String,    "",
  806.                                         GA_Disabled,    TRUE,
  807.                                     TAG_DONE);
  808.  
  809.                                     LT_SetAttributes(Handle,GAD_SEQUENCE,
  810.                                         GTST_String,    "",
  811.                                         GA_Disabled,    TRUE,
  812.                                     TAG_DONE);
  813.  
  814.                                     LT_SetAttributes(Handle,GAD_REMOVE,
  815.                                         GA_Disabled,    TRUE,
  816.                                     TAG_DONE);
  817.  
  818.                                     LT_SetAttributes(Handle,GAD_TOP,
  819.                                         GA_Disabled,    TRUE,
  820.                                     TAG_DONE);
  821.  
  822.                                     LT_SetAttributes(Handle,GAD_UP,
  823.                                         GA_Disabled,    TRUE,
  824.                                     TAG_DONE);
  825.  
  826.                                     LT_SetAttributes(Handle,GAD_DOWN,
  827.                                         GA_Disabled,    TRUE,
  828.                                     TAG_DONE);
  829.  
  830.                                     LT_SetAttributes(Handle,GAD_END,
  831.                                         GA_Disabled,    TRUE,
  832.                                     TAG_DONE);
  833.  
  834.                                     LT_SetAttributes(Handle,GAD_SAVE,
  835.                                         GA_Disabled,    !TrapList -> ListCount,
  836.                                     TAG_DONE);
  837.  
  838.                                     LT_SetAttributes(Handle,GAD_CLEAR,
  839.                                         GA_Disabled,    !TrapList -> ListCount,
  840.                                     TAG_DONE);
  841.  
  842.                                     FreeAslRequest(FileRequest);
  843.                                 }
  844.  
  845.                                 LT_UnlockWindow(LocalWindow);
  846.  
  847.                                 break;
  848.  
  849.                             case GAD_SAVE:
  850.  
  851.                                 SplitFileName(LastTraps,&DummyChar,DummyBuffer);
  852.  
  853.                                 LT_LockWindow(LocalWindow);
  854.  
  855.                                 if(FileRequest = GetFile(LocalWindow,LocaleString(MSG_TRAPPANEL_SAVE_TRAP_SETTINGS_TXT),DummyBuffer,FilePart(LastTraps),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  856.                                 {
  857.                                     if(!SaveTraps(DummyBuffer,(struct List *)TrapList))
  858.                                         ShowError(LocalWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  859.                                     else
  860.                                     {
  861.                                         strcpy(LastTraps,DummyBuffer);
  862.  
  863.                                         TrapsChanged = FALSE;
  864.                                     }
  865.  
  866.                                     FreeAslRequest(FileRequest);
  867.                                 }
  868.  
  869.                                 LT_UnlockWindow(LocalWindow);
  870.  
  871.                                 break;
  872.                         }
  873.                     }
  874.                 }
  875.             }
  876.             while(!Done);
  877.  
  878.             PopWindow();
  879.         }
  880.  
  881.         LT_DeleteHandle(Handle);
  882.     }
  883.  
  884.     for(Node = (struct TrapNode *)TrapList -> ListHeader . mlh_Head ; Next = (struct TrapNode *)Node -> Node . ln_Succ ; Node = Next)
  885.     {
  886.         if(!Node -> Node . ln_Name[0] || !Node -> SequenceLen)
  887.         {
  888.             Remove(Node);
  889.  
  890.             FreeVecPooled(Node);
  891.  
  892.             TrapList -> ListCount--;
  893.         }
  894.     }
  895.  
  896.     ReleaseSemaphore(&GenericListTable[GLIST_TRAP] -> ListSemaphore);
  897. }
  898.